const { Controller } = require('egg');

// CommonJS 开发后端的 语法层面
// ES6 Module JS ECMAScript 语言层面上定义
class ScoreController extends Controller {
    /**
     * 添加成绩
     */
    async create() {
        // 获取参数
        const { theory, skill, uid } = this.ctx.request.body;

        // 非空校验
        if (!theory || !skill || !uid) {
            this.ctx.body = {
                code: 400,
                message: '缺少必须参数',
            };
            return;
        }

        // 只有学生才能添加成绩
        const role = await this.service.user.getRoleByUid(uid);
        if (role.rid === 1) {
            this.ctx.body = {
                code: 403,
                message: '只有学生才能录入成绩',
            };
            return;
        }

        // 每日成绩只能录入一次
        const date = new Date();
        const Y = date.getFullYear(); // 2020
        const m = String(date.getMonth() + 1).padStart(2, '0'); // 07
        const d = String(date.getDate()).padStart(2, '0'); // 03
        const today = `${Y}-${m}-${d}`;
        const isRecord = await this.service.score.isRecord({ today, uid });
        if (isRecord) {
            this.ctx.body = {
                code: 403,
                message: '今日成绩已录入',
            };
            return;
        }

        // 持久化到数据库
        const res = await this.service.score.create({ theory, skill, uid });

        // 判断是否添加成功
        if (res.affectedRows !== 1) {
            this.ctx.body = {
                code: 500,
                message: '成绩录入失败',
            };
            return;
        }

        // 成功
        this.ctx.body = {
            code: 201,
            message: '成绩录入成功',
        };
    }

    /**
     * 成绩列表
     */
    async index() {
        const list = await this.service.score.readList();
        return this.ctx.helper.success(200, '获取列表成功', list);
    }

    /**
     * 更新
     */
    async update() {
        // 解构路径参数
        const { id } = this.ctx.params;

        // 解构请求体参数
        const { theory, skill } = this.ctx.request.body;

        // 非空校验
        if (!id || !theory || !skill) {
            return this.ctx.helper.fail(400, '缺少必须参数');
        }

        // 更新
        const res = await this.service.score.update({ id, theory, skill });

        // 返回响应
        if (res.affectedRows !== 1) {
            return this.ctx.helper.fail(500, '更新失败');
        }

        // 响应成功
        this.ctx.helper.success();
    }

    /**
     * 删除
     */
    async destroy() {
        // 解构参数
        const { id } = this.ctx.params;

        if (!id) {
            this.ctx.helper.fail(400, '无法解析 id 参数');
        }

        // 删除
        await this.service.score.destory(id);

        // 响应成功
        this.ctx.success();
    }
}

module.exports = ScoreController;
